import yaml
import os

class YamlConfigReader:
    def __init__(self, file_path):
        """
        初始化 YAML 配置读取器
        
        Args:
            file_path (str): YAML 文件的路径
        """
        self.file_path = file_path
        self.config = {}

        self.load()
        
    def load(self):
        """
        加载并解析 YAML 文件
        
        Returns:
            dict: 包含所有配置参数的字典
            
        Raises:
            FileNotFoundError: 当指定的文件不存在时
            yaml.YAMLError: 当 YAML 格式错误时
        """
        # 检查文件是否存在
        if not os.path.exists(self.file_path):
            raise FileNotFoundError(f"YAML 文件不存在: {self.file_path}")
        
        # 读取并解析 YAML 文件
        with open(self.file_path, 'r', encoding='utf-8') as file:
            self.config = yaml.safe_load(file)
            
        # 验证配置结构（只有一级参数）
        if self.config is not None:
            for key, value in self.config.items():
                if isinstance(value, dict):
                    raise ValueError("配置文件中存在嵌套参数（二级及以上参数），但只支持一级参数")
        
        return self.config or {}
    
    def get(self, key, default=None):
        """
        获取指定参数的值
        
        Args:
            key (str): 参数名
            default: 当参数不存在时返回的默认值
            
        Returns:
            参数的值或默认值
        """
        return self.config.get(key, default)
    
    def get_all(self):
        """
        获取所有参数
        
        Returns:
            dict: 所有配置参数的字典
        """
        return self.config.copy()


# 使用示例
if __name__ == "__main__":
    # 创建示例 YAML 文件
    sample_yaml = """
    database_host: localhost
    database_port: 3306
    debug_mode: true
    max_connections: 100
    """
    
    with open("sample_config.yaml", "w", encoding='utf-8') as f:
        f.write(sample_yaml)
    
    # 使用配置读取器
    try:
        reader = YamlConfigReader("sample_config.yaml")
        config = reader.load()
        
        print("所有配置参数:")
        for key, value in config.items():
            print(f"{key}: {value}")
            
        print(f"\n单独获取 database_port: {reader.get('database_port')}")
        print(f"获取不存在的参数: {reader.get('nonexistent', '默认值')}")
    except Exception as e:
        print(f"读取配置时出错: {e}")
    
    # 清理示例文件
    if os.path.exists("sample_config.yaml"):
        os.remove("sample_config.yaml")